{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c6a98b2c-2729-43e9-9066-d01f48ed96e0",
   "metadata": {},
   "source": [
    "Chapter 03\n",
    "\n",
    "# 用热图可视化矩阵乘法第二视角\n",
    "《线性代数》 | 鸢尾花书：数学不难"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e8ec2c7-8379-4bf6-a9a8-ffd5f7930a48",
   "metadata": {},
   "source": [
    "这段代码主要实现了**两个随机矩阵的乘法**，并通过**热图（heatmap）**可视化矩阵及其计算过程，最后通过**逐项可视化矩阵乘法的计算过程**来展示矩阵乘法的构成。\n",
    "\n",
    "---\n",
    "\n",
    "### **1. 生成随机矩阵**\n",
    "代码首先创建了两个随机矩阵 $A$ 和 $B$，其中：\n",
    "- 矩阵 $A$ 是一个 $5 \\times 12$ 的随机矩阵，其元素均在 $[-1,1]$ 之间：\n",
    "  $$\n",
    "  A = \\begin{bmatrix} \n",
    "  a_{11} & a_{12} & \\cdots & a_{1,12} \\\\ \n",
    "  a_{21} & a_{22} & \\cdots & a_{2,12} \\\\ \n",
    "  a_{31} & a_{32} & \\cdots & a_{3,12} \\\\ \n",
    "  a_{41} & a_{42} & \\cdots & a_{4,12} \\\\ \n",
    "  a_{51} & a_{52} & \\cdots & a_{5,12} \n",
    "  \\end{bmatrix}\n",
    "  $$\n",
    "- 矩阵 $B$ 是一个 $12 \\times 8$ 的随机矩阵，其元素同样在 $[-1,1]$ 之间：\n",
    "  $$\n",
    "  B = \\begin{bmatrix} \n",
    "  b_{11} & b_{12} & \\cdots & b_{1,8} \\\\ \n",
    "  b_{21} & b_{22} & \\cdots & b_{2,8} \\\\ \n",
    "  \\vdots & \\vdots & \\ddots & \\vdots \\\\ \n",
    "  b_{12,1} & b_{12,2} & \\cdots & b_{12,8} \n",
    "  \\end{bmatrix}\n",
    "  $$\n",
    "\n",
    "**可视化**：用 `seaborn.heatmap` 生成两个矩阵的热图，使数据的大小通过颜色直观呈现。\n",
    "\n",
    "---\n",
    "\n",
    "### **2. 计算矩阵乘法**\n",
    "矩阵乘法定义为：\n",
    "$$\n",
    "C = A \\cdot B\n",
    "$$\n",
    "其中：\n",
    "- $A$ 的**列数**（12）必须等于 $B$ 的**行数**（12）。\n",
    "- 结果矩阵 $C$ 的**形状**是 $5 \\times 8$，即：\n",
    "  $$\n",
    "  C = \\begin{bmatrix} \n",
    "  c_{11} & c_{12} & \\cdots & c_{1,8} \\\\ \n",
    "  c_{21} & c_{22} & \\cdots & c_{2,8} \\\\ \n",
    "  c_{31} & c_{32} & \\cdots & c_{3,8} \\\\ \n",
    "  c_{41} & c_{42} & \\cdots & c_{4,8} \\\\ \n",
    "  c_{51} & c_{52} & \\cdots & c_{5,8} \n",
    "  \\end{bmatrix}\n",
    "  $$\n",
    "  其中：\n",
    "  $$\n",
    "  c_{ij} = \\sum_{k=1}^{12} a_{ik} \\cdot b_{kj}\n",
    "  $$\n",
    "  也就是说，每个元素 $c_{ij}$ 由 $A$ 的第 $i$ 行与 $B$ 的第 $j$ 列对应元素相乘后求和得到：\n",
    "  $$\n",
    "  C = A B = \\left[\n",
    "  \\begin{array}{ccc}\n",
    "  \\sum_{k=1}^{12} a_{1k} b_{k1} & \\sum_{k=1}^{12} a_{1k} b_{k2} & \\cdots \\\\\n",
    "  \\sum_{k=1}^{12} a_{2k} b_{k1} & \\sum_{k=1}^{12} a_{2k} b_{k2} & \\cdots \\\\\n",
    "  \\vdots & \\vdots & \\ddots\n",
    "  \\end{array}\n",
    "  \\right]\n",
    "  $$\n",
    "\n",
    "**可视化**：\n",
    "- 结果矩阵 $C$ 也被绘制成**热图**，显示计算后的矩阵值。\n",
    "- 通过 `matplotlib`，结果矩阵 $C$ 的热图与运算符（=，@）并排显示，方便理解矩阵计算过程。\n",
    "\n",
    "---\n",
    "\n",
    "### **3. 逐步分解矩阵乘法**\n",
    "矩阵乘法的计算本质上是逐列计算 $A$ 和逐行计算 $B$ 的**向量点积**。  \n",
    "代码通过 `C_k = A[:,[k]] @ B [[k],:]` 逐列计算 $A$ 的每一列和 $B$ 的每一行的**外积**，即：\n",
    "$$\n",
    "C_k = A_{[:,k]} B_{[k,:]}\n",
    "$$\n",
    "其中：\n",
    "- $A_{[:,k]}$ 是 $A$ 的第 $k$ 列，形状为 $5 \\times 1$。\n",
    "- $B_{[k,:]}$ 是 $B$ 的第 $k$ 行，形状为 $1 \\times 8$。\n",
    "- 结果 $C_k$ 具有形状 $5 \\times 8$，表示 $A$ 的第 $k$ 列与 $B$ 的第 $k$ 行的外积。\n",
    "\n",
    "最终，所有 $C_k$ **逐项相加**，得出最终的 $C$：\n",
    "$$\n",
    "C = \\sum_{k=1}^{12} C_k\n",
    "$$\n",
    "\n",
    "**可视化**：\n",
    "- 代码使用 `matplotlib` 创建了一个 $3 \\times 4$ 的子图，每个子图对应一个 $C_k$，展示了矩阵乘法的逐步构成过程。\n",
    "\n",
    "---\n",
    "\n",
    "### **4. 结论**\n",
    "这段代码展示了**矩阵乘法的直观计算过程**：\n",
    "- 通过 `numpy` 生成随机矩阵 $A$ 和 $B$，并可视化它们。\n",
    "- 计算矩阵乘积 $C = A B$，并绘制 $C$ 的热图。\n",
    "- 逐步拆解矩阵乘法的构成，展示 $C_k$ 的累积贡献，使矩阵乘法的过程更加透明直观。\n",
    "\n",
    "这一过程符合**线性代数**中的矩阵运算规则，并通过图像方式直观展示了矩阵计算的步骤，适用于**教学和理解矩阵乘法的计算过程**。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ece0de0f-22f5-4e81-b7a1-52ba9c655323",
   "metadata": {},
   "source": [
    "## 初始化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e7785bcb-527f-4d48-bfd6-f96aa060144c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np  # 导入数值计算库\n",
    "import seaborn as sns  # 导入数据可视化库\n",
    "from matplotlib import pyplot as plt  # 导入绘图库"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a508235-6982-4cb3-98ea-5cb1cdf7dd41",
   "metadata": {},
   "source": [
    "## 创建矩阵A和B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d54c24ce-a341-4258-bb2e-495012d34e83",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.2951021 ,  0.01429938,  0.05668276,  0.79257041,  0.39998238,\n",
       "         0.4285942 ,  0.43467676, -0.55436108, -0.64969095, -0.08631702,\n",
       "         0.85747686, -0.98022823],\n",
       "       [-0.82015561,  0.70040054, -0.02875788,  0.75367118, -0.38533212,\n",
       "        -0.22406891,  0.16289149, -0.77262564,  0.53576037, -0.37486792,\n",
       "         0.29202092, -0.93460217],\n",
       "       [-0.66720885, -0.13939394, -0.54438706,  0.93261493,  0.80987882,\n",
       "         0.73132583, -0.93567444,  0.5989955 ,  0.81231102,  0.40786666,\n",
       "        -0.54057511, -0.1771288 ],\n",
       "       [ 0.95728792, -0.34190808,  0.19105814,  0.07169268, -0.07780809,\n",
       "        -0.54840068,  0.84110593,  0.22164568, -0.55981616, -0.9214308 ,\n",
       "         0.09577916, -0.81962657],\n",
       "       [ 0.63613656,  0.36713916,  0.87165598, -0.82017787, -0.97328478,\n",
       "        -0.56777511, -0.23258517,  0.47506735, -0.48989147, -0.48920298,\n",
       "        -0.52213956, -0.78695798]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.random.seed(88)  # 保证每次运行生成相同的随机数\n",
    "A = np.random.uniform(-1, 1, (5, 12))\n",
    "# 生成一个 5×12 的随机整数矩阵（数值范围 0~10）\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "c67d8ec4-5bb6-4d83-9e05-d35990ea25c3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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9PR07d6921JVeKisrJQkXXvttZZLLq+mpkarV69WdXW1UlNTbefUk52drVGjRmnEiBG2U/w6ePCgEhIS1LVrV40fP16HDx+2neRjw4YNSklJ0X333af27durX79+euWVV2xn+XX+/Hm9/vrryszMlMvlsp3jY9CgQXr33Xd14MABSdJf//pX7dq1S7/4xS8sl/3gwoULqqmpUYsWLXyOR0dHa9euXZaq/Dty5IhOnDjh8/7H7XZr6NChvP+RFGk7oDF98803qqmpUYcOHXyOd+jQQSdOnLBU1fQ5jqPc3FwNGjRIvXr1sp3jo7S0VKmpqTp37pyuueYavfnmm7r55pttZ/lYvXq19u7da/VzzQ25/fbbtXLlSt100036+9//rqeeekppaWkqKytT27ZtbedJkg4fPqwlS5YoNzdXTzzxhD7++GP97ne/k9vt1oMPPmg7r57169fr1KlTeuihh2yn1DNjxgxVVlYqKSlJERERqqmp0bx58zRhwgTbaXVatWql1NRU/fGPf1RycrI6dOigN954Qx999JF69OhhO6+eS+9jLvf+5+jRozaSQkpYjY1L/u9HEY7jhNxHFk3JY489pk8++SQkP5pITExUSUmJTp06pbVr12ry5MnasWNHyAyO48ePa+rUqdqyZUu9j9BCSUZGRt23e/furdTUVHXv3l0rVqxQbm6uxbIf1NbWKiUlRfPnz5ck9evXT2VlZVqyZElIjo1XX31VGRkZSkhIsJ1Sz5o1a/T6669r1apV6tmzp0pKSpSTk6OEhARNnjzZdl6d1157TZmZmbr++usVERGh/v37a+LEidq7d6/tNL94/3N5YTU22rVrp4iIiHpXMSoqKuqtTVyZ3/72t9qwYYN27typjh072s6pp3nz5rrxxhslSSkpKSoqKtILL7ygl19+2XLZRcXFxaqoqNCAAQPqjtXU1Gjnzp1atGiRvF6vIiIiLBZeXkxMjHr37q2DBw/aTqkTHx9fb0QmJydr7dq1lor8O3r0qLZu3ap169bZTrms6dOna+bMmRo/frykiwPz6NGjys/PD6mx0b17d+3YsUPV1dWqqqpSfHy8xo0bp65du9pOq+fSq7dOnDih+Pj4uuO8/7korJ6z0bx5cw0YMKDuGeCXFBYWKi0tzVJV0+Q4jh577DGtW7dO27ZtC8m/3JfjOI68Xq/tjDrDhw9XaWmpSkpK6m4pKSm6//77VVJSEpJDQ5K8Xq/Ky8t9HjRtGzhwYL2XXx84cEBdunSxVOTf8uXL1b59e40aNcp2ymWdOXNGzZr5PvxHRESE3EtfL4mJiVF8fLy+/fZbbd68WXfddZftpHq6du2quLg4n/c/58+f144dO3j/ozC7siFJubm5euCBB5SSkqLU1FQtXbpUx44dU1ZWlu20Ot99950OHTpU9/0jR46opKRE1157rTp37myx7AfZ2dlatWqV3nrrLbVq1arualHr1q0VHR1tue6iJ554QhkZGerUqZNOnz6t1atX67333tOmTZtsp9Vp1apVvee5xMTEqG3btiH1/Jdp06Zp9OjR6ty5syoqKvTUU0+pqqoqpD7Kffzxx5WWlqb58+dr7Nix+vjjj7V06VItXbrUdpqP2tpaLV++XJMnT1ZkZGg+xI4ePVrz5s1T586d1bNnT+3bt08LFixQZmam7TQfmzdvluM4SkxM1KFDhzR9+nQlJibq4YcfttLT0GN3Tk6O5s+frx49eqhHjx6aP3++WrZsqYkTJ4ZU58mTJ3Xs2DF9+eWXklQ34uPi4sx9fR3jr3exYPHixU6XLl2c5s2bO/379w+5l2tu377dkVTvNnnyZNtpdS7XJ8lZvny57bQ6mZmZdf+fr7vuOmf48OHOli1bbGc1KBRf+jpu3DgnPj7eiYqKchISEpx77rnHKSsrs51Vz9tvv+306tXLcbvdTlJSkrN06VLbSfVs3rzZkeTs37/fdopfVVVVztSpU53OnTs7LVq0cLp16+bMmjXL8Xq9ttN8rFmzxunWrZvTvHlzJy4uzsnOznZOnTplraehx+7a2lonLy/PiYuLc9xutzNkyBCntLQ05DqXL19+2fvz8vKMNfFPzAMAAKPC6jkbAAAg9DA2AACAUYwNAABgFGMDAAAYxdgAAABGMTYAAIBRjA0AAGAUYwMAABjF2AAAAEYxNgAAgFGMDQAAYBRjAwAAGPW/Q2ATLlF190AAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.heatmap(A, cmap = 'RdYlBu_r', square = True, \n",
    "            cbar = False,\n",
    "            linecolor = 'w', linewidths = 0.25)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "f5f12b9b-36f5-49a6-a1d8-4bdf9b956704",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.63544881,  0.78586467, -0.8805252 , -0.66807296, -0.92597501,\n",
       "         0.40170689,  0.99329933, -0.77794562],\n",
       "       [ 0.44911418, -0.32517321, -0.6463447 ,  0.88373575,  0.95186898,\n",
       "         0.52953172, -0.19490997, -0.16397646],\n",
       "       [ 0.28995495, -0.92863205, -0.73063709,  0.26954949,  0.86110223,\n",
       "         0.90084512,  0.12667943, -0.57593776],\n",
       "       [ 0.0818441 , -0.65333352, -0.70500183,  0.45299007, -0.58046341,\n",
       "        -0.95581985,  0.25193687,  0.90186504],\n",
       "       [ 0.78719916, -0.26147268,  0.85737295,  0.02976143,  0.88742041,\n",
       "         0.13894219, -0.97340213, -0.32344632],\n",
       "       [-0.76270929, -0.31874168, -0.27196198,  0.30947122,  0.87200487,\n",
       "        -0.60105042,  0.24760211, -0.68565583],\n",
       "       [-0.8348775 ,  0.38619428, -0.45257766, -0.19015451,  0.99434971,\n",
       "         0.0082224 ,  0.87605771, -0.28638224],\n",
       "       [-0.40400711, -0.7689096 , -0.09600042,  0.95586342, -0.06598517,\n",
       "        -0.93511531,  0.31161634, -0.94289277],\n",
       "       [-0.39658628,  0.95619366, -0.84529541, -0.31177212, -0.99557658,\n",
       "         0.37476923, -0.93195442, -0.44681321],\n",
       "       [-0.9639589 , -0.8175903 ,  0.91542455,  0.77615542,  0.31394815,\n",
       "         0.95950185, -0.07857369, -0.84930187],\n",
       "       [ 0.60937844,  0.27349324,  0.4083768 ,  0.94846395,  0.3103788 ,\n",
       "         0.35963455, -0.32960103,  0.59283227],\n",
       "       [-0.38290982, -0.99518425,  0.94131515, -0.45964301,  0.73569824,\n",
       "        -0.02837254,  0.83754994,  0.21442016]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B =  np.random.uniform(-1, 1, (12, 8))\n",
    "# 生成一个 5×12 的随机整数矩阵（数值范围 0~10）\n",
    "B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "0a566b18-2699-4803-8cbb-cf67866fd0b1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.heatmap(B, cmap = 'RdYlBu_r', square = True, \n",
    "            cbar = False,\n",
    "            linecolor = 'w', linewidths = 0.25)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dfeed245-4e33-4910-9833-2137fd34faa3",
   "metadata": {},
   "source": [
    "## 矩阵乘法 A@B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "7d3b567f-da0f-4c6a-897f-f95eacf02cba",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.98797093,  0.66910163, -0.88876459,  1.12118591,  0.69130305,\n",
       "        -0.25055795, -0.06932378,  1.08696502],\n",
       "       [ 1.61749156,  1.31993114, -2.06638394,  0.89880038, -0.60852435,\n",
       "         0.072751  , -1.89227367,  2.23129511],\n",
       "       [-0.07813197, -1.37788175,  0.57851779,  1.23120289, -1.1172428 ,\n",
       "        -2.11212281, -2.4691439 , -0.4314863 ],\n",
       "       [ 0.34710126,  2.04869843, -2.23427683, -1.05088561, -1.11971085,\n",
       "        -0.61067229,  1.68173533,  0.13102407],\n",
       "       [ 0.2644065 ,  0.65919255, -2.46419918, -0.30393328, -1.04122842,\n",
       "         0.96055876,  1.22317478, -1.31792664]])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C = A @ B\n",
    "C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "85fe8fe6-0b22-45c8-aecf-666084b060ff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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tGmlwl9cSkqKfvCDHyShMgAAgMphVQCMRCJaunSpcnJydPnllye7HAAAgKSwKgDu3btXR48eVWZmZrJLAQAASBrHGGOSXURl2bVrly655BL16dNHr732WrLLAQCgSnAcJ9klwCW3sc6qFcD69eurZs2a2rp1a7JLAQAASBqr3gXs9/vVpUsXLVq0SDt27FDjxo2TXRIAAFVCp6HzXLddNvVOSVLkzfs8jeG/7feSpOnrvnDdZ0huE0nS54ePehqraZ2akqRX1Nx1n34qkiSZyJ9d93H8/0uStLJxlofqpBt2bJEkrd55yHWfdpfUdd3WqhVASXr88cdljNGQIUNUXFx8xv2hUEgLFixIQmUAAACVw6oVQEnKz8/X5MmTNXz4cOXk5GjYsGH6zne+o1AopPXr12vatGnKzs7WrbfemuxSAQAAKoR1AVCShgwZory8PD3zzDOaOHGidu7cqWAwqObNm6tv374aMWJEsksEAACoMFYGQEm67rrr9OKLLya7DAAAgEpn3WsAAQAAbEcABAAAsAwBEAAAwDIEQAAAAMsQAAEAACxDAAQAALCMY9xeNRgAAFjJcZxklwCX3MY61/sA8p9fdZDpAQBAeTxtBF38Qm/XbVOG/1GSFFk2ylNB/k7PSJKWbd/vuk+ny9MlScf+7w9c96nxv/8kSYosedBDdZK/67OSpKOhD1z3qRn8riTJhN/1NJYT6CZJOj7xdtd90v7zDU9jAADgxh8373LdtneLhpKknmPf8TTGW0/2kCQdOPGx6z7/kXq1JGleWnNPY915vEiSdCS0wXWfWsFWkqS87jNd91mzeJAkKfLeox6qk/zfnxQbq+vv3Y+15D7XbXkNIADr/O53v5PjOMrOzk52KQCQFARAANaZOTP21/tHH32k1atXJ7kaAKh8BEAAVlm3bp3++c9/qmfPnpKkGTNmJLkiAKh8BEAAVokHvgkTJqhDhw6aM2eOjh49muSqAKByEQABWOPYsWN67bXX1LZtW2VnZ2vQoEE6fPiwXn/99WSXBgCVigAIwBpz587VwYMHNXjwYEnSPffco9q1a/M0MADrEAABWGPGjBmqUaOG+vTpI0mqXbu27r77br333nv6+GP3204AQFVHAARghU8++UQrV65Uz549ZYzRgQMHdODAAd11112STr0zGABsQAAEYIWZM2fKGKO5c+cqPT29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",
      "text/plain": [
       "<Figure size 800x300 with 8 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 5, figsize=(8, 3))  \n",
    "\n",
    "plt.sca(axs[0])\n",
    "ax = sns.heatmap(C, cmap='RdYlBu_r', \n",
    "                 linecolor = 'k', linewidths = '0.25',\n",
    "                 xticklabels = [], yticklabels = [],\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('C')\n",
    "\n",
    "plt.sca(axs[1])\n",
    "plt.title('=')  # 绘制等号\n",
    "plt.axis('off')\n",
    "\n",
    "plt.sca(axs[2])\n",
    "ax = sns.heatmap(A, cmap='RdYlBu_r', \n",
    "                 linecolor = 'k', linewidths = '0.25',\n",
    "                 xticklabels = [], yticklabels = [],\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('A')\n",
    "\n",
    "plt.sca(axs[3])\n",
    "plt.title('@')  # 绘制乘号\n",
    "plt.axis('off')\n",
    "\n",
    "plt.sca(axs[4])\n",
    "ax = sns.heatmap(B, cmap='RdYlBu_r', \n",
    "                 linecolor = 'k', linewidths = '0.25',\n",
    "                 xticklabels = [], yticklabels = [],\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('B')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a47dacd-9157-461b-89bb-7a3d558679fc",
   "metadata": {},
   "source": [
    "## 叠加"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "33879ad6-5f01-437e-af59-aaf51964b0bd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5, 12)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A_shape = A.shape\n",
    "A_shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "c640b314-ac14-4aa8-b4ff-8178c809eb8c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p = A_shape[1]\n",
    "p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "290e8b0c-aff0-4904-95f6-b378cddfe755",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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KioqNG3aNA0dOlQ9e/Z0vT5aBrdzWFxcrA4dOujmm2/W6tWrtXPnTr355pt69tlnNXbsWGVlZbnQdfry9QC4ZcsW7dmzx7UTUnZ2tm677TY9++yzKikp0W9+8xutX79eZ511lt566y1XjoGWx+0cfv7559qzZ4+uvPJKXX311frHP/6hu+++W3/60590wQUXyBjjynHQcridwYP9+c9/1t69e/X9738/KfXRMridwx49eqisrEzLly/XiSeeqPbt2+viiy9WcXGxfvOb37hyjHTGD4G4qKCgQAUFBbX/PvPMM3XZZZfplFNO0bhx4zR8+PAUdge/iEajqqys1IQJEzR+/HhJ0llnnaWMjAzdfvvteuedd3TuueemuEv4yZQpU9SpUydddtllqW4FPrJ27VpdfPHF6tq1q6ZNm6bOnTtrwYIF+vnPf65du3ZpypQpqW4xpXz9CmBOTo7atGmjNWvWJO0YHTp00EUXXaRly5Zp7969STsO0pfbOezUqZMkxf2H4/zzz5ckffDBB64cBy1HMs+Fy5Yt0+LFi/W9732vwe/pAmq4ncPx48drx44deuutt3TFFVdo8ODBuvvuu/XEE0/oueee07x581w5Trry9QAYDAY1dOhQLVmyRJ999lnSjlPzJTfHcZJ2DKQvt3PYt2/fBrfX5DAQ8PWnPRqQzHNhzassP/jBD1yti5bH7Rx++OGH6tOnT9z3+tX8GqLly5cf8THSme+vBPfcc4+MMRozZoz2798f9/6qqirNmDHDuv62bdv05ptv6tRTT1VmZuaRtIoWzM0cXnHFFZKkWbNm1dv+97//XZI0aNCgI+wWLVEyzoX79u3Tiy++qAEDBvC7UJEQN3N4zDHH6H//93+1a9euetvLysokSccdd9yRN5zGHMN3hNf+0snevXvr5ptv1sknn6yqqiotXbpUkyZNUn5+fkK/dPLaa69Vbm6u+vfvr5ycHH300Ud67LHH9Mknn2jWrFl83xUOya0cStIll1yit99+W/fdd58GDRqkxYsXa+LEiTr33HOP6D80aNnczKAkvfLKK7rmmms0adIkjRkzJomdoyVxK4d/+9vfdOmll2rgwIG64447lJOTo/nz5+uXv/ylcnNztXTpUn//KpiU/QZCj/nwww9NcXGxyc3NNRkZGSYrK8sUFBSY+++/32zatCmhGr/85S/Nqaee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DlVZWVmSHwXShVt527p1qyZNmqR9+/bp0ksvPeS+K1as0FlnnaX9+/frL3/5i5577jmtWrVKZ555pjZv3uzCo0K6SUUO33nnHf3jH/9Qbm6uTj/9dBceBdJdc+dw7969euCBB9S9e3c98cQT+vvf/64xY8Zo0qRJOuOMM7R3716XHlkaMD5XWlpqgsGgGTFihKmsrIx7/759+8wbb7yRUK3hw4ebrl27mt27d9du27Fjh8nJyTGnn366az0jfbmZt2g0aqLRqDHGmM2bNxtJZsKECQ3ue+WVV5qcnBxTUVFRu23t2rUmHA6bcePGNf2BIK2lKoeRSKT2/v/7f//PSDJr1qxpcv9oGVKRw+rqarNly5a47a+++qqRZF544YWmPYg05vtXAB966CE5jqNJkyapVatWce/PyMjQJZdcklCt999/X2eddZbatGlTu61du3YaPHiwSktL9cUXX7jWN9KTm3lzHEeO4xx2v+rqar355pu64oor1L59+9rt3bt319lnn63XX3898QeAFiEVOZSkQMD3lxzUkYocBoNBderUKW77gAEDJEnr169P6Hgtga8/GyORiObMmaPCwkIdf/zxR1xv//79DYa4Ztu///3vIz4G0pfbeUvUJ598or1796pv375x7+vbt68+/vhjVVZWNls/SK1U5RCoy2s5nDNnjiTp5JNPTnEnzcfXA+CWLVu0Z88e9ezZ05V6ffr00fz58xWNRmu3VVdXa8GCBZJi36MA/3I7b4mqyd1RRx0V976jjjpKxhht27atWXtC6qQqh0BdXsrh559/rvHjx6t///666KKLUt1Os/H1AOi2H/7wh1q1apVuvfVWff7551q/fr1uuukmffrpp5L48gdS61BfHkn0S3gA0JJ89dVXuuCCC2SM0SuvvOKr67R/HmkDcnJy1KZNG61Zs8aVejfccIMefvhhvfDCCzruuOOUm5ur8vJy3XXXXZKkY4891pXjID25nbdE1Xy/S0OvQH/11VdyHEcdOnRo1p6QOqnKIVCXF3K4bds2nXfeefr88881e/ZsnXDCCSnrJRV8PQAGg0ENHTpUS5Ys0WeffeZKzR//+MfasmWL/v3vf2vt2rUqLS3Vtm3blJWVpcLCQleOgfSUjLwl4sQTT1Tr1q0b/B7Uf//73zrppJOUmZnZbP0gtVKVQ6CuVOdw27ZtOvfcc7Vm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",
      "text/plain": [
       "<Figure size 800x600 with 24 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(3, 4, figsize=(8, 6))  \n",
    "axs = axs.flatten()\n",
    "\n",
    "for k in range(p):\n",
    "    C_k = A[:,[k]] @ B [[k],:]\n",
    "\n",
    "    plt.sca(axs[k])\n",
    "    ax = sns.heatmap(C_k, cmap='RdYlBu_r', \n",
    "                     linecolor = 'k', linewidths = '0.25',\n",
    "                     xticklabels = [], yticklabels = [],\n",
    "                     cbar_kws={\"orientation\": \"horizontal\"})\n",
    "    ax.set_aspect(\"equal\")\n",
    "    plt.title('C_' + str(k+1))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f21cc7df-ac13-483b-8812-d04089338125",
   "metadata": {},
   "source": [
    "作者\t**生姜DrGinger**  \n",
    "脚本\t**生姜DrGinger**  \n",
    "视频\t**崔崔CuiCui**  \n",
    "开源资源\t[**GitHub**](https://github.com/Visualize-ML)  \n",
    "平台\t[**油管**](https://www.youtube.com/@DrGinger_Jiang)\t\t\n",
    "\t\t[**iris小课堂**](https://space.bilibili.com/3546865719052873)\t\t\n",
    "\t\t[**生姜DrGinger**](https://space.bilibili.com/513194466)  "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:base] *",
   "language": "python",
   "name": "conda-base-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
